package java_chapter;
import java.util.Scanner;

/**
 * Java基础知识综合练习程序 - 学生信息管理系统
 *
 * 本程序涵盖以下知识点：
 * 第3章：常量、变量、数据类型转换、局部变量类型推断、键盘输入、运算符与表达式
 * 第4章：流程控制（语句与复合语句、顺序结构、分支结构、循环结构、跳转语句、退出）
 *
 * @author 学习者
 * @version 1.0
 */
public class StudentManagementSystem_chapter4 {

    // 3.3 常量定义 - 使用final关键字定义程序中的常量
    public static final int MAX_STUDENTS = 50;          // 最大学生数量
    public static final double PASS_SCORE = 60.0;       // 及格分数
    public static final double EXCELLENT_SCORE = 90.0;  // 优秀分数
    public static final String SYSTEM_NAME = "学生信息管理系统";  // 系统名称
    public static final String VERSION = "v1.0";        // 版本号

    public static void main(String[] args) {
        // 3.7 从键盘输入数据 - 创建Scanner对象用于读取用户输入
        Scanner scanner = new Scanner(System.in);

        // 显示系统欢迎信息
        System.out.println("==========================================");
        System.out.println("    欢迎使用 " + SYSTEM_NAME + " " + VERSION);
        System.out.println("==========================================");

        // 3.4 变量声明 - 声明不同类型的变量
        String studentName;      // 学生姓名 - 字符串类型
        int age;                // 年龄 - 整数类型
        double height;          // 身高(米) - 双精度浮点类型
        char gender;            // 性别 - 字符类型
        boolean isMonitor;      // 是否班长 - 布尔类型
        float weight;           // 体重(kg) - 单精度浮点类型
        long studentId;         // 学号 - 长整型
        short classNumber;      // 班级号 - 短整型
        byte examCount;         // 考试次数 - 字节类型

        // 3.6 局部变量的类型推断 - 使用var关键字让编译器自动推断类型
        var totalStudents = 0;              // 编译器推断为int类型
        var averageHeight = 0.0;            // 编译器推断为double类型
        var systemRunning = true;           // 编译器推断为boolean类型
        var menuChoice = "";                // 编译器推断为String类型

        // 4.1 语句与复合语句、4.2 顺序结构 - 按顺序执行的语句
        System.out.println("请输入学生基本信息：");
        System.out.println("及格分数：" + PASS_SCORE + "分");
        System.out.println("优秀分数：" + EXCELLENT_SCORE + "分");

        // 主程序循环 - 4.4 循环结构的体现
        while (systemRunning) {
            // 显示菜单
            System.out.println("\n========== 主菜单 ==========");
            System.out.println("1. 录入学生信息");
            System.out.println("2. 成绩计算与分析");
            System.out.println("3. 数据类型转换演示");
            System.out.println("4. 运算符综合练习");
            System.out.println("5. 流程控制结构演示");
            System.out.println("0. 退出系统");
            System.out.print("请选择功能（0-5）：");

            menuChoice = scanner.next();

            // 4.3 分支结构 - 使用switch语句进行多分支选择
            switch (menuChoice) {
                case "1":
                    // ========== 录入学生信息模块 ==========
                    System.out.println("\n========== 录入学生信息 ==========");

                    // 清空输入缓冲区
                    scanner.nextLine();

                    // 3.7 从键盘输入数据 - 获取用户输入
                    System.out.print("请输入学生姓名：");
                    studentName = scanner.nextLine();

                    System.out.print("请输入年龄（整数）：");
                    age = scanner.nextInt();

                    System.out.print("请输入身高（米，小数）：");
                    height = scanner.nextDouble();

                    System.out.print("请输入性别（M/F）：");
                    gender = scanner.next().charAt(0);  // 获取字符串的第一个字符

                    System.out.print("是否班长（true/false）：");
                    isMonitor = scanner.nextBoolean();

                    System.out.print("请输入体重（kg）：");
                    weight = scanner.nextFloat();

                    System.out.print("请输入学号（长整数）：");
                    studentId = scanner.nextLong();

                    System.out.print("请输入班级号（1-99）：");
                    classNumber = scanner.nextShort();

                    System.out.print("请输入考试次数（1-10）：");
                    examCount = scanner.nextByte();

                    // 显示录入的信息
                    System.out.println("\n========== 学生信息确认 ==========");
                    System.out.println("姓名：" + studentName);
                    System.out.println("年龄：" + age + "岁");
                    System.out.println("身高：" + height + "米");
                    System.out.println("性别：" + (gender == 'M' ? "男" : "女"));  // 4.3 条件运算符
                    System.out.println("班长：" + (isMonitor ? "是" : "否"));
                    System.out.println("体重：" + weight + "kg");
                    System.out.println("学号：" + studentId);
                    System.out.println("班级：" + classNumber + "班");
                    System.out.println("考试次数：" + examCount + "次");

                    totalStudents++;  // 3.8 自增运算符
                    break;

                case "2":
                    // ========== 成绩计算与分析模块 ==========
                    System.out.println("\n========== 成绩计算与分析 ==========");

                    // 声明成绩相关变量
                    double mathScore, chineseScore, englishScore;
                    double totalScore, averageScore;
                    String grade;

                    // 输入三门课程成绩
                    System.out.print("请输入数学成绩：");
                    mathScore = scanner.nextDouble();

                    System.out.print("请输入语文成绩：");
                    chineseScore = scanner.nextDouble();

                    System.out.print("请输入英语成绩：");
                    englishScore = scanner.nextDouble();

                    // 3.8 运算符与表达式 - 算术运算符的使用
                    totalScore = mathScore + chineseScore + englishScore;  // 加法运算
                    averageScore = totalScore / 3;                         // 除法运算

                    // 4.3 分支结构 - 多重if-else if语句
                    if (averageScore >= EXCELLENT_SCORE) {
                        grade = "优秀";
                    } else if (averageScore >= 80) {
                        grade = "良好";
                    } else if (averageScore >= 70) {
                        grade = "中等";
                    } else if (averageScore >= PASS_SCORE) {
                        grade = "及格";
                    } else {
                        grade = "不及格";
                    }

                    // 3.8 关系运算符和逻辑运算符
                    boolean allPassed = mathScore >= PASS_SCORE &&
                            chineseScore >= PASS_SCORE &&
                            englishScore >= PASS_SCORE;  // 逻辑与运算符

                    boolean hasExcellent = mathScore >= EXCELLENT_SCORE ||
                            chineseScore >= EXCELLENT_SCORE ||
                            englishScore >= EXCELLENT_SCORE;  // 逻辑或运算符

                    // 显示成绩分析结果
                    System.out.println("--- 成绩分析结果 ---");
                    System.out.printf("数学：%.1f分\n", mathScore);
                    System.out.printf("语文：%.1f分\n", chineseScore);
                    System.out.printf("英语：%.1f分\n", englishScore);
                    System.out.printf("总分：%.1f分\n", totalScore);
                    System.out.printf("平均分：%.2f分\n", averageScore);
                    System.out.println("等级：" + grade);
                    System.out.println("三门全部及格：" + (allPassed ? "是" : "否"));
                    System.out.println("有优秀科目：" + (hasExcellent ? "是" : "否"));

                    // 4.3 嵌套if语句
                    if (averageScore >= PASS_SCORE) {
                        if (averageScore >= EXCELLENT_SCORE) {
                            System.out.println("恭喜！成绩优秀，继续保持！");
                        } else {
                            System.out.println("成绩良好，继续努力！");
                        }
                    } else {
                        System.out.println("成绩需要提高，加油！");
                    }
                    break;

                case "3":
                    // ========== 数据类型转换演示模块 ==========
                    System.out.println("\n========== 数据类型转换演示 ==========");

                    // 3.5 数据类型之间的转换

                    // 1. 自动类型转换（隐式转换）- 从小范围到大范围
                    System.out.println("--- 自动类型转换演示 ---");
                    byte byteNum = 100;
                    short shortNum = byteNum;      // byte → short
                    int intNum = shortNum;         // short → int
                    long longNum = intNum;         // int → long
                    float floatNum = longNum;      // long → float
                    double doubleNum = floatNum;   // float → double

                    System.out.println("byte " + byteNum + " → short " + shortNum);
                    System.out.println("short " + shortNum + " → int " + intNum);
                    System.out.println("int " + intNum + " → long " + longNum);
                    System.out.println("long " + longNum + " → float " + floatNum);
                    System.out.println("float " + floatNum + " → double " + doubleNum);

                    // 2. 强制类型转换（显式转换）- 可能丢失精度
                    System.out.println("\n--- 强制类型转换演示 ---");
                    double pi = 3.14159265;
                    float piFloat = (float) pi;    // double → float（可能丢失精度）
                    int piInt = (int) pi;          // double → int（丢失小数部分）

                    System.out.println("原始double值：" + pi);
                    System.out.println("转换为float：" + piFloat);
                    System.out.println("转换为int：" + piInt + "（小数部分被截断）");

                    // 3. 字符与数字的转换
                    System.out.println("\n--- 字符与数字转换演示 ---");
                    char letter = 'A';
                    int asciiValue = letter;           // char → int（ASCII码值）
                    char nextLetter = (char)(asciiValue + 1);  // int → char

                    System.out.println("字符 '" + letter + "' 的ASCII码：" + asciiValue);
                    System.out.println("ASCII码 " + (asciiValue + 1) + " 对应字符：'" + nextLetter + "'");

                    // 4. 字符串与数字的转换
                    System.out.println("\n--- 字符串与数字转换演示 ---");
                    int number = 123;
                    String numberStr = String.valueOf(number);     // 数字 → 字符串
                    String strNumber = "456";
                    int parsedNumber = Integer.parseInt(strNumber); // 字符串 → 数字

                    System.out.println("数字 " + number + " 转为字符串：\"" + numberStr + "\"");
                    System.out.println("字符串 \"" + strNumber + "\" 转为数字：" + parsedNumber);
                    break;

                case "4":
                    // ========== 运算符综合练习模块 ==========
                    System.out.println("\n========== 运算符综合练习 ==========");

                    System.out.print("请输入第一个整数：");
                    int num1 = scanner.nextInt();
                    System.out.print("请输入第二个整数：");
                    int num2 = scanner.nextInt();

                    // 3.8 算术运算符
                    System.out.println("\n--- 算术运算符 ---");
                    System.out.println(num1 + " + " + num2 + " = " + (num1 + num2));
                    System.out.println(num1 + " - " + num2 + " = " + (num1 - num2));
                    System.out.println(num1 + " * " + num2 + " = " + (num1 * num2));
                    if (num2 != 0) {
                        System.out.println(num1 + " / " + num2 + " = " + (num1 / num2));
                        System.out.println(num1 + " % " + num2 + " = " + (num1 % num2));
                    } else {
                        System.out.println("除数不能为0！");
                    }

                    // 3.8 自增自减运算符
                    System.out.println("\n--- 自增自减运算符 ---");
                    int temp1 = num1, temp2 = num1;
                    System.out.println("原始值：" + num1);
                    System.out.println("temp1++（后缀）：" + (temp1++) + "，运算后temp1：" + temp1);
                    System.out.println("++temp2（前缀）：" + (++temp2) + "，运算后temp2：" + temp2);

                    // 3.8 关系运算符
                    System.out.println("\n--- 关系运算符 ---");
                    System.out.println(num1 + " > " + num2 + " : " + (num1 > num2));
                    System.out.println(num1 + " < " + num2 + " : " + (num1 < num2));
                    System.out.println(num1 + " >= " + num2 + " : " + (num1 >= num2));
                    System.out.println(num1 + " <= " + num2 + " : " + (num1 <= num2));
                    System.out.println(num1 + " == " + num2 + " : " + (num1 == num2));
                    System.out.println(num1 + " != " + num2 + " : " + (num1 != num2));

                    // 3.8 逻辑运算符
                    System.out.println("\n--- 逻辑运算符 ---");
                    boolean condition1 = num1 > 0;
                    boolean condition2 = num2 > 0;
                    System.out.println("num1 > 0: " + condition1);
                    System.out.println("num2 > 0: " + condition2);
                    System.out.println("逻辑与(&&): " + (condition1 && condition2));
                    System.out.println("逻辑或(||): " + (condition1 || condition2));
                    System.out.println("逻辑非(!condition1): " + (!condition1));

                    // 3.8 赋值运算符
                    System.out.println("\n--- 赋值运算符 ---");
                    int result = num1;
                    System.out.println("初始值：" + result);
                    result += num2;
                    System.out.println("加法赋值(+=)：" + result);
                    result -= num2;
                    System.out.println("减法赋值(-=)：" + result);
                    result *= 2;
                    System.out.println("乘法赋值(*=)：" + result);
                    result /= 2;
                    System.out.println("除法赋值(/=)：" + result);

                    // 3.8 条件运算符（三目运算符）
                    String comparison = (num1 > num2) ? (num1 + "大于" + num2) :
                            (num1 < num2) ? (num1 + "小于" + num2) :
                                    (num1 + "等于" + num2);
                    System.out.println("\n条件运算符结果：" + comparison);
                    break;

                case "5":
                    // ========== 流程控制结构演示模块 ==========
                    System.out.println("\n========== 流程控制结构演示 ==========");

                    // 4.4 循环结构演示
                    System.out.println("--- for循环演示：打印1到10 ---");
                    for (int i = 1; i <= 10; i++) {  // for循环
                        System.out.print(i + " ");
                    }
                    System.out.println();

                    System.out.println("\n--- while循环演示：计算1到5的和 ---");
                    int sum = 0;
                    int i = 1;
                    while (i <= 5) {  // while循环
                        sum += i;
                        System.out.println("当前i=" + i + ", 累计和=" + sum);
                        i++;
                    }

                    System.out.println("\n--- do-while循环演示：用户输入验证 ---");
                    int userInput;
                    do {  // do-while循环（至少执行一次）
                        System.out.print("请输入1-100之间的数字：");
                        userInput = scanner.nextInt();
                        if (userInput < 1 || userInput > 100) {
                            System.out.println("输入无效，请重新输入！");
                        }
                    } while (userInput < 1 || userInput > 100);
                    System.out.println("输入有效：" + userInput);

                    // 4.5 循环中的跳转语句
                    System.out.println("\n--- break和continue演示 ---");
                    System.out.println("找出1-20中第一个能被7整除的数：");
                    for (int j = 1; j <= 20; j++) {
                        if (j % 7 != 0) {
                            continue;  // 跳过本次循环，继续下一次
                        }
                        System.out.println("找到了：" + j);
                        break;  // 跳出循环
                    }

                    System.out.println("\n打印1-10，但跳过5：");
                    for (int k = 1; k <= 10; k++) {
                        if (k == 5) {
                            continue;  // 跳过5
                        }
                        System.out.print(k + " ");
                    }
                    System.out.println();

                    // 嵌套循环演示
                    System.out.println("\n--- 嵌套循环：打印乘法表 ---");
                    for (int row = 1; row <= 3; row++) {
                        for (int col = 1; col <= 3; col++) {
                            System.out.print(row + "*" + col + "=" + (row*col) + "\t");
                        }
                        System.out.println();  // 换行
                    }
                    break;

                case "0":
                    // 4.6 退出
                    System.out.println("\n正在退出系统...");
                    System.out.println("感谢使用" + SYSTEM_NAME + "！");
                    systemRunning = false;  // 设置循环退出条件
                    break;

                default:
                    // 4.3 分支结构的默认情况
                    System.out.println("输入无效，请选择0-5之间的数字！");
                    break;
            }

            // 如果不是退出，询问是否继续
            if (systemRunning) {
                System.out.print("\n按回车键继续...");
                try {
                    System.in.read();  // 等待用户按键
                } catch (Exception e) {
                    // 异常处理（简单处理）
                }
            }
        }

        // 关闭Scanner资源
        scanner.close();

        // 程序结束
        System.out.println("程序已结束。");
    }
}